检查对象或数组中是否存在值

时间:2017-02-08 15:16:10

标签: javascript arrays object find lodash

我有以下格式的数据

var list2 = [
  {
    items:{ 
      val: 'a'
    }
  },
  {
    items:[
      {
        val: 'b'
      },
      {
        val: 'c'
      },
    ]
  }
];

例如,我需要检查列表是否包含val = 'b'的项目。

如您所见,这是一个对象数组,每个对象都有items属性,可以是单个对象,也可以是对象数组。

2 个答案:

答案 0 :(得分:1)

Lodash

对于一个简单的测试,如果至少有一个项目与我们搜索到的属性匹配,则返回true_.some将起作用。

function test(arr, matches) {
  return _.some(arr, obj => {
    var items = obj.items;
    // make non-array items an array.
    return _.some(!_.isArray(items) ? [items]: items, matches);
  });
}

var hasValA = test(list2, { val: 'a' });



function test(arr, matches) {
  return _.some(arr, obj => {
    var items = obj.items;
    return _.some(!_.isArray(items) ? [items]: items, matches);
  });
}

var list1 = [{
    items: [{
      val: 'a'
    }]
  }],
  list2 = [{
    items: {
      val: 'a'
    }
  }, {
    items: [{
      val: 'b'
    }, {
      val: 'c'
    }, ]
  }],
  list3 = [{
    items: [{
      val: 'b'
    }]
  }];

var matches = {
  val: 'a'
};

console.log("list1:", test(list1, matches));
console.log("list2:", test(list2, matches));
console.log("list3:", test(list3, matches));

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
&#13;
&#13;
&#13;

ES6

的帮助下,这也可以在普通的ES6中实现
function test(arr, matches) {
  return arr.some(obj => {
    var items = obj.items;
    if (!Array.isArray(items)) items = [items];
    return items.some(obj => {
      return Object.keys(matches).every(key => matches[key] === obj[key]);
    });
  });
}

var hasValA = test(list2, { val: 'a' });

&#13;
&#13;
function test(arr, matches) {
  return arr.some(obj => {
    var items = obj.items;
    if (!Array.isArray(items)) items = [items];
    return items.some(obj => {
      return Object.keys(matches).every(key => matches[key] === obj[key]);
    });
  });
}

var list1 = [{
    items: [{
      val: 'a'
    }]
  }],
  list2 = [{
    items: {
      val: 'a'
    }
  }, {
    items: [{
      val: 'b'
    }, {
      val: 'c'
    }, ]
  }],
  list3 = [{
    items: [{
      val: 'b'
    }]
  }];

var matches = {
  val: 'a'
};

console.log("list1:", test(list1, matches));
console.log("list2:", test(list2, matches));
console.log("list3:", test(list3, matches));
&#13;
&#13;
&#13;

这两种解决方案都适用于更复杂的对象来匹配。

test(list2, { val: 'a', other: 2, /* ... */ });

答案 1 :(得分:0)

您可以使用flatMap从阵列中拾取和展平项目,然后使用some

var result = _(list2)
    .flatMap('items')
    .some({val: 'a'})