过滤密钥的最佳方式

时间:2016-05-24 19:57:52

标签: javascript arrays

我的数据如下:

var data = [
    {item1: 123, item2: "name", item3: "id"},
    {item1: 234, item2: "other"},
    {item1: 456, item2: "another"},
    {item1: 789, item2: "again"}
]

如何循环查找item3是否存在,如果不存在,请填写。

9 个答案:

答案 0 :(得分:2)

您可以使用正常的for循环迭代数组元素,也可以使用functional approach



var data = [
    {item1: 123, item2: "name", item3: "id"},
    {item1: 234, item2: "other"},
    {item1: 456, item2: "another"},
    {item1: 789, item2: "again"}
];

// 1. Using Array.foreach:
data.forEach(function(element) {
  if (!element.hasOwnProperty('item3')) element.item3 = "default";
});

// 2. Using Array.map: 
data = data.map(function(element) {
  if (!element.hasOwnProperty('item3')) element.item3 = "default";
  return element;
});

// 3. Using a for-loop:
for (var i = 0, length = data.length; i < length; ++i) {
  if (!data[i].hasOwnProperty('item3')) data[i].item3 = "default";
}

console.log(data);
&#13;
&#13;
&#13;

如果您不想保留原始数据阵列,我建议使用1或2.

Chrome 48上的效果(类似于Firefox 44,运行100000次):

  • Array.foreach()520ms
  • Array.map()790ms
  • for-loop 2700ms

可能的解释:由于Array.foreach()和Array.map()回调不引用传递参数之外的任何内容,现代JIT可以缓存传递的内联函数,并且优于传统的for循环。

答案 1 :(得分:1)

data.forEach(function (item) { 
    if (item.item3 == undefined) item.item3 = "filled with something"
});

答案 2 :(得分:1)

您可以使用for循环按顺序迭代每个项目。

for(var i = 0; i < data.length; i++) {
    //check to see if item3 is NOT there
    if(typeof data[i].item3 === 'undefined') {
        data[i].item3 = 'default value';
    }
}

答案 3 :(得分:1)

使用简单的for...of循环:

for (const element of data) {
  if (!("item3" in element)) {
    element.item3 = "something"
  }
}

答案 4 :(得分:1)

迭代并检查密钥是否存在。

var data = [
    { item1: 123, item2: "name", item3: "id" },
    { item1: 234, item2: "other" },
    { item1: 456, item2: "another" },
    { item1: 789, item2: "again" }
]

function fillIn(data, key, value)
{
    for(var i = 0, numRows = data.length; i < numRows; ++i)
    {
        if(!(key in data[i])) data[i][key] = value;
    }
}

fillIn(data, "item3", "dingo");

答案 5 :(得分:1)

尝试以下循环:

       for (var i = 0; i < data.length; i++){
            for (var item in data[i]){
            if (item == "item3"){
                console.log("found");
            }
          }
        }

答案 6 :(得分:0)

for(var elem in data){
    var isPresent = 0;
    for(var key in data[elem]){
        if(key == "item3"){
            isPresent = 1;
        }
    }
    if(!isPresent){
        //Whatever function you need
    }

这应该是它。

答案 7 :(得分:0)

虽然规范是针对没有item3的对象进行过滤,但我建议使用Array#filter

&#13;
&#13;
var data = [{ item1: 123, item2: "name", item3: "id" }, { item1: 234, item2: "other" }, { item1: 456, item2: "another" }, { item1: 789, item2: "again" }],
    dataWithoutItem3 = data.filter(function (o) {
        return !('item3' in o);
    });

document.write('<pre>' + JSON.stringify(dataWithoutItem3, 0, 4) + '</pre>');
&#13;
&#13;
&#13;

答案 8 :(得分:0)

你就是这样做的;

var data = [
    {item1: 123, item2: "name", item3: "id"},
    {item1: 234, item2: "other"},
    {item1: 456, item2: "another"},
    {item1: 789, item2: "again"}
],
 newData = data.map(o => !o.item3 ? (o.item3 = "something",o) : o);

console.log(newData);