【问题标题】:Converting JSON object into array of arrays in javascript在javascript中将JSON对象转换为数组数组
【发布时间】:2019-05-20 13:57:13
【问题描述】:

我试图从 JSON 对象中获取特定的 key 数组值并将其存储在一个数组中,如下所示。

示例:

var obj = { "1":{"class":2,"percent":0.99,"box":[0.2,0.3,0.4,0.5]},
            "2":{"class":2,"percent":0.99,"box":[0.12,0.23,0.45,0.56]},
            "3":{"class":2,"percent":0.99,"box":[0.52,0.83,0.34,0.59]}
           } 

诸如此类

现在我需要获取键“box”的值并存储在一个数组中。

var list = []
list = [[0.2,0.3,0.4,0.5],[0.12,0.23,0.45,0.56],[0.52,0.83,0.34,0.59]]

但是,我尝试了多种方法将数组存储在数组中,但是当我打印列表时我可以得到这样的结果

list = 0.2,0.3,0.4,0.5,0.12,0.23,0.45,0.56,0.52,0.83,0.34,0.59

【问题讨论】:

  • 您的 JSON 不正确。
  • @holydragon 我觉得不错
  • @Feathercrown 好吧。它已被编辑。现在是正确的。
  • @holydragon 啊,错过了:P

标签: javascript node.js json multidimensional-array javascript-objects


【解决方案1】:

试试这个:

Object.values(obj).map(x=>x.box);

var obj = { "1":{"class":2,"percent":0.99,"box":[0.2,0.3,0.4,0.5]},
            "2":{"class":2,"percent":0.99,"box":[0.12,0.23,0.45,0.56]},
            "3":{"class":2,"percent":0.99,"box":[0.52,0.83,0.34,0.59]}
           } 
           
let list = Object.values(obj).map(x=>x.box);

console.log(JSON.stringify(list))

Object.values 返回 obj 值数组,然后我们使用 map 迭代该值(我们使用 arrow function)并使用框值创建新数组。

【讨论】:

  • 我不知道Object.values 在那里。谢谢!
【解决方案2】:

您可以使用 Object.keys(它返回一个包含您的 json 的所有键的数组)结合数组的映射将您的 json 转换为一个新数组:

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

您也可以使用 Object.values,这在您的情况下实际上更好:

const boxes = Object.values(obj).map(value => value.box)

工作原理

Object.keys 返回一个数组:

Object.keys(obj) // ["1", "2", "3"]

然后您可以映射它们以获取每个项目的值:

Object.keys(obj).map(key => obj[key]) // [{box: [...]}, {box: [...]}, {box: [...]}]

那么在array.map的回调中,你可以简单的只返回box值:

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

没有 Object.keys()

function getBoxes (object) {
  var boxes = [];
  for (var key in object) {
    if (!object.hasOwnProperty(key)) continue;
    boxes.push(object[key].box);
  }
  return boxes;
}

console.log(getBoxes(obj))

for...in 可以循环遍历对象的属性,但它也会循环遍历继承的属性,因此我们需要用object.hasOwnProperty(key) 保护循环。


Object.keys(): 返回一个对象的所有可枚举属性名的数组

Object.values(): 返回一个对象的所有可枚举值的数组

array.map(): 返回一个新数组,原始数组的每一项都在给定的回调函数中转换

array.slice(): 返回原始数组的浅拷贝

【讨论】:

  • @Shiva 这是一个带有您提供的 obj 的 jsbin:jsbin.com/sexuqahiqa/edit?js,console
  • const boxes = Object.values(obj).map(value => value.box) 但第一种方法不是存储在应该像这样的数组数组中 [[1,2,3 ,4],[3,6,7,8],[5,8,9,3]]
  • @Shiva 我不确定我们是否正在查看相同的代码?我在这里创建了一个具有完全相同功能的新函数,它返回嵌套数组:jsbin.com/cicubuhobo/edit?js,console
  • 列表:0.27345794439315796,0.5364106297492981,0.4557124972343445,0.7002899050712585
  • @Shiva 这就是我在看的东西:imgur.com/a/uid9Hbi 我把原来的弄乱了一点,把 console.log() 改为 console.log(boxes[0]) 只记录出第一个值,也许这就是你正在看的?
【解决方案3】:

查看下一个示例:

1)首先,使用Object.keys()得到一个包含对象键的数组。

2) 其次,循环每个key 并访问与每个键关联的对象的box 属性,然后将此box 属性推送到新数组上。

var obj = {
    "1": {"class":2, "percent":0.99, "box":[0.2,0.3,0.4,0.5]},
    "2": {"class":2, "percent":0.99, "box":[0.12,0.23,0.45,0.56]},
    "3": {"class":2, "percent":0.99, "box":[0.52,0.83,0.34,0.59]}
};

var arrayOfArrays = [];

Object.keys(obj).forEach(function(k){
    arrayOfArrays.push(obj[k].box);
});

console.log(arrayOfArrays);

这是(只是为了好玩)使用reduce() 方法的另一种替代方法:

var obj = {
    "1": {"class":2, "percent":0.99, "box":[0.2,0.3,0.4,0.5]},
    "2": {"class":2, "percent":0.99, "box":[0.12,0.23,0.45,0.56]},
    "3": {"class":2, "percent":0.99, "box":[0.52,0.83,0.34,0.59]}
};

const reducer = (accumulator, currVal) => {
    accumulator.push(currVal.box);
    return accumulator;
};

arrayOfArrays = Object.values(obj).reduce(reducer, []);

console.log(arrayOfArrays);

【讨论】:

  • 我尝试了同样的方法,但无法实现。
猜你喜欢
  • 2021-03-20
  • 2021-05-02
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多