使用JavaScript joud

时间:2015-05-19 13:49:00

标签: javascript arrays json angularjs object

我正在尝试迭代嵌套对象。

    array=[
  {
    id: 2,
    items: [
      {
        id: 12
      },
      {
        id: 13
      },
      {
        id: 14
      }
    ]
  },
  {
    id: 3,
    items: [
      {
        id: 15
      },
      {
        id: 16
      },
      {
        id: 17
      },
      {
        id: 18
      },
      {
        id: 19
      }
    ]
  },
  {
    id: 4,
    items: [
      {
        id: 20
      },
      {
        id: 21
      }
    ]
  },
  {
    id: 5,
    items: [
      {
        id: 22
      }
    ]
  }
];

我需要将所有ID都推送到一个数组中,以便我们可以在上面的代码中看到。像这样:

arrayOfId = [2, 12, 13, 14, 3, 15, 16, 17, 18, 19, 4, 20, 21, 5, 22];

我试图自己做,并在这里找到一些例子,但它们基于jQuery。我在我的项目中使用Angular。

也许有人知道使用普通JS或Angular来解决这个问题吗?

非常感谢。

6 个答案:

答案 0 :(得分:0)

你可以在另一个循环中使用for循环。

for (var i = 0; i < array.length; i++) {
  arrayOfId.push(array[i].id);
  for (var j = 0; j < array[i].length; j++) {
    arrayOfId.push(array[i][j]);
  }
}

答案 1 :(得分:0)

实际上非常简单。

  1. 获取数组的长度。
  2. 循环遍历数组并使用当前ids值推送新数组(id)。
  3. 获取嵌套数组的长度。
  4. 循环遍历并将嵌套的id也推送到该数组中。
  5. var l=array.length,i=0,ids=[];
    for(;i<l;i++){
     ids.push(array[i].id);
     var nested=array[i].items,nl=nested.length,j=0;
     for(;j<nl;ids.push(nested[j++].id));
    };
    
    console.log(ids);
    alert(ids);
    
    //ids=[2,12,13,14,3,15,16,17,18,19,4,20,21,5,22];
    

    在这个例子中,我展示了编写for循环的各种方法。 此外,通过缓存 length以及nested数组等其他变量,性能提升。我还想提一下,对于像这样的简单函数,你需要通过多维数组/对象 LOOP , 不鼓励使用forEachmapfilter或其他“新”原生javascript函数,因为标准while&amp; for循环(1)。它们慢大约3-4倍。另一方面,如果您知道您的多维数组不是那么大而客户端使用现代浏览器,则map解决方案是“短代码”替代方案(2)。

    <强>样本

    http://jsfiddle.net/axaog3n2/1/

    1 https://jsperf.com/for-vs-foreach/2

    2 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/map

    如果您有任何问题,请询问。

答案 2 :(得分:0)

使用Array.map

//This will give a 2d array of ids [[2,3],[2,3]];
var ids = array.map(function(item) {
    return item.items.map(function(obj) {
        return obj.id
    })
});

//Now flatten and merge
var idList = [];
idList = idList.concat.apply(idList , ids);

//Output:
//[12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]

演示:http://jsfiddle.net/2kmozrr7/

答案 3 :(得分:0)

简单的循环

var arrayOfId = [];
for (var i = 0; i < array.length; i++) {
    arrayOfId.push(array[i].id);
    if (array[i]['items'] != undefined && array[i].items.length > 0) {
        for(var j = 0; j < array[i].items.length; j++) {
            arrayOfId.push(array[i].items[j].id);
        }
    }

}

答案 4 :(得分:0)

var ids = [];
for (var x = 0; x < array.length; x++) {
    ids.push(array[x].id);
    if (array[x].items) {
        var items = array[x].items;
        for (var y = 0; y < items.length; y++) {
            if (items[y].id) {
                ids.push(items[y].id);
            }
        }
    }
}

除此之外,您还需要使用递归函数来做到这一点。

var results = [];
function build(array, results) {
    for (var x = 0; x < array.length; x++) {
        results.push(results[x].id);
        if (results[x].items) {
            build(results[x].items, results);
        }
    }
}
build(thatObject, results);

答案 5 :(得分:0)

// create array for result
var b = [];
// iterate over the source array
array.forEach(function (outer) {
    // get the id property and push the value to the result array
    b.push(outer.id);
    // iterate over the items
    outer.items.forEach(function (inner) {
        // get the id property of the inner array object and push the value to the result array
        b.push(inner.id);
    });
});