【问题标题】:Javascript iterate Json Array to get valuesJavascript 迭代 Json 数组以获取值
【发布时间】:2019-06-26 15:12:19
【问题描述】:

我有一个下面的 JavaScript

var arr = [];
arr.push({0:'Zero'});
arr.push({1:'One'});
console.log(Object.keys(arr));
console.log(Object.values(arr)); //Not getting expected result

我想分别打印键和值,可以获取键但不能获取值。

【问题讨论】:

  • 您将一个对象推入每个数组索引。您需要按索引访问它,然后按键/值。您的意思是改为创建var obj = {} 吗?如果是这种情况,push 将不会被使用,您只需直接设置密钥,例如obj[0] = 'Zero',有效地创建 { 0: 'Zero', 1: 'One' } 而不是 [ { 0: 'Zero' }, { 1: 'One' }...]

标签: javascript arrays string object ecmascript-6


【解决方案1】:

这是因为arr 是一个数组,而不是一个对象。你应该像这样使用map

var arr = [];
arr.push({0: 'Zero'})
arr.push({1: 'One'})
console.log(arr.map(e => Object.keys(e)).flat(1));
console.log(arr.map(e => Object.values(e)).flat(1));

我使用flat 使数组变平,而不是嵌套。

【讨论】:

  • 不错,但 .flat 对于跨浏览器兼容性而言不能被视为可靠
【解决方案2】:

在这里,您将Objects 推入数组,因此您需要使用索引来访问它们。

var arr = [];
arr.push({0:'Zero'})
arr.push({1:'One'})

let values = arr.map((e,index)=> arr[index][Object.keys(e)[0]])
console.log(values)

附注:您的两个控制台都无法正常工作,将密钥更改为 0 and 1 以外的任何其他值,然后查看输出。如果数组Object.keys 将返回数组的索引0, 1 and so on

var arr = [];
arr.push({0:'Zero'})
arr.push({10:'One'})

console.log(Object.keys(arr))

这可能是您想要实现的目标。如果是这种情况,您需要使用{} ( Object ) 而不是[] ( Array )

var arr = {};
arr['0'] = 'Zero';
arr['1'] = 'One';

console.log(Object.keys(arr));
console.log(Object.values(arr))

【讨论】:

    【解决方案3】:

    您可以使用.flatMap 从对象中获取键/值(以数组的形式),然后将数组展平为您的结果:

    const arr = [];
    arr.push({0: 'Zero'})
    arr.push({1: 'One'})
    
    console.log(arr.flatMap(Object.keys));
    console.log(arr.flatMap(Object.values));

    但是,请注意,.flatMap 具有 limited browser support,因此它可能不适用于所有浏览器。相反,如果您不能使用.flatMap 并且想要更稳定的解决方案,您可以使用.reduce

    const arr = [];
    arr.push({0: 'Zero'});
    arr.push({1: 'One'});
    
    console.log(arr.reduce((acc, obj) => [...acc, Object.keys(obj).shift()], []));
    console.log(arr.reduce((acc, obj) => [...acc, Object.values(obj).shift()], []));

    【讨论】:

      【解决方案4】:

      如果数组中的对象只有一个key和一个value,那么你可以在map()中使用Object.entries(),如下所示:

      var arr = [];
      arr.push({0:'Zero'});
      arr.push({1:'One'});
      
      let keys = arr.map(o => Object.entries(o)[0][0]);
      let values = arr.map(o => Object.entries(o)[0][1]);
      console.log(JSON.stringify(keys), JSON.stringify(values));

      否则,您可以像其他人提到的那样使用flat()flatMap() 的实验版本,或者像这样使用reduce() 的版本:

      var arr = [];
      arr.push({0:'Zero'});
      arr.push({1:'One', 2: 'two', 3: 'three'});
      
      let keys = arr.reduce(
          (acc, curr) => acc.concat(Object.keys(curr)),
          []
      );
      
      let values = arr.reduce(
          (acc, curr) => acc.concat(Object.values(curr)),
          []
      );
      
      console.log(JSON.stringify(keys), JSON.stringify(values));

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-10
        • 1970-01-01
        • 1970-01-01
        • 2020-10-25
        相关资源
        最近更新 更多