检查数组中的所有对象是否都具有公共属性

时间:2017-10-03 03:40:55

标签: javascript

我有一个对象数组,我试图循环并检查一个公共密钥,如果它存在于所有对象。如果所有对象都不存在特定键,则返回false。

这是我的代码

var x = [{
  "item": "alpha",
  "value": "red"
}, {
  "item": "beta",
  "value": "blue"
}, {
  "item": "beta",
  "value": "gama"
}]

function test(obj) {
  var count = 0;
  var out = false;
  for (var i = 0; i < obj.length; i++) {
    if (obj[i].hasOwnProperty('value')) {
      count = i;
    }
  }
  if (count == obj.length) {
    out = true
  }
}

console.log(test(x))

我未定义。无法弄清楚我在这里缺少什么

3 个答案:

答案 0 :(得分:0)

这是我的实现,它在给定一组对象的情况下找到每个匹配键,甚至是嵌套键:

function recurse_obj(obj, cb, _stack = []) {
    for (var k in obj) {
        cb(k, obj[k], _stack);
        if (obj.hasOwnProperty(k) && (obj[k] instanceof Object)) {
            _stack.push(k);
            recurse_obj(obj[k], cb, _stack);
            _stack.pop();
        }
    }
}

function obj_all_keys(obj) {
    var tmp = [];

    recurse_obj(obj, (k, v, stack) => {
        var ext = (stack.length) ? "." : ""; 
        tmp.push(stack.join(".").concat(ext, k));
    }); 

    return tmp;
}

function key_intersection(...objs) {
    var lookup = {};

    objs.forEach(o => {
        obj_all_keys(o).forEach(k => {
            if (k in lookup === false)
                lookup[k] = 0;
            lookup[k]++;
        });
    });

    for (var k in lookup)
        if (lookup[k] !== objs.length)
            delete lookup[k];

    return lookup;
}

这是调用代码:

var me = { name: { first: "rafael", last: "cepeda" }, age: 23, meta: { nested: { foo: { bar: "hi" } } } };    
console.log(key_intersection(me, { name: { first: "hi" } }));

输出:{ name: 2, 'name.first': 2 }

返回的对象仅包括在所有对象中找到的键,集合交集,计数来自簿记,并且出于性能原因未在被调用者中删除,如果需要,调用者可以执行此操作。

其他嵌套键中包含的键可以从列表中排除,因为它们是隐含的,但我将它们留在那里是为了彻底。

传递集合(对象数组)是微不足道的: key_intersection.apply(this, collection);

或es6语法: key_intersection(...collection);

答案 1 :(得分:0)

一种非常简单的方法是使用Array#every这样的

&#13;
&#13;
var x = [{
  "item": "alpha",
  "value": "red"
}, {
  "item": "beta",
  "value": "blue"
}, {
  "item": "beta",
  "value": "gama"
}]

function test(obj) {
  return obj.every(a => a.hasOwnProperty("value"));
}

console.log(test(x))
&#13;
&#13;
&#13;

<强>更新

首先正确地提到comment

答案 2 :(得分:0)

这可以是此对象的简单解决方案:

var x = [{
  "item": "alpha",
  "value": "red"
}, {
  "item": "beta",
  "value": "blue"
}, {
  "item": "beta",
  "value": "gama"
}];

function test(obj) {
   var keyCount = 0;

   obj.forEach(function (item, index) {
      item.hasOwnProperty('value') && ++keyCount;
   });

   return keyCount == obj.length;
}

console.log(test(x));