将JSON对象转换为JavaScript中的二维数组

4

我尝试从JSON对象中获取特定键的数组值,并将其存储在一个数组中,它将看起来像这样。

示例:

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
@holydragon 看起来不错 - Feathercrown
@Feathercrown 好的,已经编辑过了。现在是正确的。 - holydragon
@holydragon 哦,我错过了那个:P - Feathercrown
3个回答

12
您可以使用 Object.keys(返回您的 JSON 的所有键的数组)与数组的 map 结合使用,将您的 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的回调函数中,您可以只返回盒子的值:

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 这是一个包含您提供对象的jsbin链接:https://jsbin.com/sexuqahiqa/edit?js,console - Derek Nguyen
const boxes = Object.values(obj).map(value => value.box)但是第一种方法并没有存储在数组的数组中,应该是这样的 [[1,2,3,4],[3,6,7,8],[5,8,9,3]] - Shiva
列表:0.27345794439315796、0.5364106297492981、0.4557124972343445、0.7002899050712585 - Shiva
@Shiva 这就是我在看的东西:https://imgur.com/a/uid9Hbi我稍微改了一下原来的代码,将 console.log() 改成了 console.log(boxes[0]),这样只会输出第一个值,也许这就是你想要的? - Derek Nguyen
我的 JSON 对象在这个控制台 https://jsbin.com/cicubuhobo/3/edit?js,console 中可以工作,但在我的代码编辑器中却不行 :( - Shiva
显示剩余2条评论

4

试试这个:

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返回对象值数组,然后我们使用map来遍历这些值(我们使用箭头函数),并创建一个带有盒子值的新数组。


我不知道有 Object.values 这个方法。谢谢! - explorer

2

请看下一个例子:

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);


我尝试了同样的方法,但无法实现。 - Shiva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接