使用 jQuery 将 JS 对象转换为数组

IT技术 javascript jquery arrays object
2021-01-11 14:50:54

我的应用程序创建了一个 JavaScript 对象,如下所示:

myObj= {1:[Array-Data], 2:[Array-Data]}

但我需要这个对象作为一个数组。

array[1]:[Array-Data]
array[2]:[Array-Data]

因此,我尝试通过遍历$.each对象并将元素添加到数组来将此对象转换为数组:

x=[]
$.each(myObj, function(i,n) {
    x.push(n);});

有没有更好的方法将对象转换为数组或函数?

6个回答

如果您正在寻找一种功能方法:

var obj = {1: 11, 2: 22};
var arr = Object.keys(obj).map(function (key) { return obj[key]; });

结果是:

[11, 22]

与 ES6 箭头函数相同:

Object.keys(obj).map(key => obj[key])

使用 ES7,您将能够使用Object.values更多信息):

var arr = Object.values(obj);

或者,如果您已经在使用 Underscore/Lo-Dash:

var arr = _.values(obj)
对于第一段代码,我缺少分号。不知道为什么。
2021-03-14 14:50:54
@JohnnyBizzle 我猜你的 linter 需要写“return obj[key];” 以分号结尾。JavaScript 没有。
2021-03-17 14:50:54
对最佳答案不满意,我只是写了这个几乎完全相同的函数,回来将其作为答案发布,向下滚动,看到 170。意识到了,伙计,如果我没有放弃,我就不必考虑:) 这应该在顶部。OP 请选择作为答案。
2021-03-21 14:50:54
对于任何不明显的人来说,键不需要是连续的(即在这个例子中它们是 1 和 2 - 但它们也可以是字符串键或非序列号
2021-03-29 14:50:54
var myObj = {
    1: [1, 2, 3],
    2: [4, 5, 6]
};

var array = $.map(myObj, function(value, index) {
    return [value];
});


console.log(array);

输出:

[[1, 2, 3], [4, 5, 6]]
您也可以在没有 jQuery 的情况下执行此操作: Object.keys(myObject).map(function(val) { return [val] });
2021-03-11 14:50:54
@TD_Nijboer 是的,使用value.key = index; return [value];代替return [value];
2021-03-12 14:50:54
有没有办法维护新数组中的键?我看到的 www 上的每个答案都缺少密钥转换。
2021-03-20 14:50:54
@Dogbert,你能解释一下$.map吗?我尝试在这方面进行的每次搜索都会找到大量指向 jQuery 或数组的 map 方法的链接。
2021-03-22 14:50:54
哦!无视我的评论。我没有注意到这个问题上的 jQuery 标签。
2021-03-28 14:50:54

简单地做

Object.values(obj);

就这样!

Object.values 是一种 ES2017 方法,Safari、IE、Node 6 不支持。
2021-03-18 14:50:54

我认为您可以使用for in但检查该财产是否未继承

myObj= {1:[Array-Data], 2:[Array-Data]}
var arr =[];
for( var i in myObj ) {
    if (myObj.hasOwnProperty(i)){
       arr.push(myObj[i]);
    }
}

编辑 - 如果你想你也可以保留你的对象的索引,但你必须检查它们是否是数字(并且你会得到缺失索引的未定义值:

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

myObj= {1:[1,2], 2:[3,4]}
var arr =[];
for( var i in myObj ) {
    if (myObj.hasOwnProperty(i)){
        if (isNumber(i)){
            arr[i] = myObj[i];
        }else{
          arr.push(myObj[i]);
        }
    }
}
您应该已经测试了代码。$.map会变平Array-Data
2021-03-14 14:50:54
@Nicola Peluchetti $.makeArray() 听起来不错,但不是我想要的,因为它只是将对象放入数组元素:[{1:[Array-Data], 2:[Array-Data]}]而且$.map()看起来也不成功。它接缝,所有子阵列数据合并到一个阵列。array.length应该返回 2(因为存在 2 个元素),但它返回 67,这是所有 ["Array-Data"] 中所有元素的数量。
2021-03-17 14:50:54
你是对的,我没有用数组测试它,地图将它展平!我修改了答案
2021-03-19 14:50:54
我认为您必须明确指定数组索引...就像arr[+i] = myObj[i];因为 (i)for(...in...)不能保证以任何顺序返回属性 (ii) 在 OP 的示例中,属性从 1 开始,而不是 0。
2021-03-20 14:50:54
@The Bndr 我发布了另一个解决方案,但您可以按照 dogbert 的建议使用地图
2021-04-02 14:50:54

如果您知道对象中的最大索引,则可以执行以下操作:

var myObj = {
    1: ['c', 'd'],
    2: ['a', 'b']
  },
  myArr;

myObj.length = 3; //max index + 1
myArr = Array.prototype.slice.apply(myObj);
console.log(myArr); //[undefined, ['c', 'd'], ['a', 'b']]

myObj.length = Object.keys(myObj).length
2021-03-20 14:50:54
生成对象的代码最好也设置长度,或者首先将其设置为数组。我不希望两者都有可能,所以这个答案对我来说没有帮助。
2021-03-31 14:50:54