使用Javascript在Object Array中搜索值

时间:2018-01-04 16:54:25

标签: javascript jquery arrays

我有一个Object数组。我需要为每个属性应用包含过滤器(如果任何一个属性包含输入的值,它必须搜索该关键字并返回该对象)。请告诉我如何使用Jquery / Javascript进行contains搜索。

示例:

var itemPrices = [
    { 'custName': 'Mike', 'custid': '1'},
    { 'custName': 'secondMike', 'custid': '2' },
    { 'custName': 'Ben', 'custid': '3' },
    { 'custName': 'dan', 'custid': '4' }
];

所以,从上面的数组中,如果我搜索Mike,它必须在custName中返回包含mike的2条记录,或者如果我搜索1,它必须返回id为1的客户。所以它必须搜索每个和每个对象中的每个属性并返回匹配的对象。

它更像是对象数组中的一般搜索。

由于

4 个答案:

答案 0 :(得分:3)

您可以通过检查所有属性来过滤数组。

如果您的属性不是字符串,则需要在使用String#indexOf之前转换为字符串。



function search(array, value) {
    value = value.toString().toLowerCase();
    return array.filter(function (o) {
        return Object.keys(o).some(function (k) {
            return o[k].toString().toLowerCase().indexOf(value) !== -1;
        });
    });
}

var itemPrices = [{ custName: 'Mike', custid: '1'}, { custName: 'secondMike', custid: '2' }, { custName: 'Ben', custid: '3' }, { custName: 'dan', custid: '4' }];

console.log(search(itemPrices, 'Mike'));
console.log(search(itemPrices, 2));

.as-console-wrapper { max-height: 100% !important; top: 0; }




答案 1 :(得分:1)

这可以通过迭代对象数组来完成,然后是每个对象的属性,如下所示:

var matches = [];
var searchString = 'Mike';
var itemPrices = [
    { 'custName': 'Mike', 'custid': '1'},
    { 'custName': 'secondMike', 'custid': '2' },
    { 'custName': 'Ben', 'custid': '3' },
    { 'custName': 'dan', 'custid': '4' }
];

for (var i = 0; i < itemPrices.length; i++) {
    for(var prop in itemPrices[i]) {
        if (itemPrices[i][prop].includes(searchString)) {
            matches.push(itemPrices[i]);
            break;
        }
    }
}

console.log(matches);

作为一种功能,因为这是一种更可重复使用的解决方案:

function searchObjectArrayProperties(searchString, arrayToSearch) {
  var matches = [];
  for (var i = 0; i < arrayToSearch.length; i++) {
    for(var prop in arrayToSearch[i]) {
      if (arrayToSearch[i][prop].includes(searchString)) {
        matches.push(arrayToSearch[i]);
        break;
      }
    }
  }

  return matches;
}

var itemPrices = [
  { 'custName': 'Mike', 'custid': '1'},
  { 'custName': 'secondMike', 'custid': '2' },
  { 'custName': 'Ben', 'custid': '3' },
  { 'custName': 'dan', 'custid': '4' }
];

// Then use the function like:
console.log(searchObjectArrayProperties('Mike', itemPrices));

答案 2 :(得分:0)

使用数组&#39; filter()

尝试以下操作

&#13;
&#13;
var itemPrices = [
        { 'custName': 'Mike', 'custid': '1'},
        { 'custName': 'secondMike', 'custid': '2'},
        { 'custName': 'Ben', 'custid': '3' },
        { 'custName': 'dan', 'custid': '4' }
    ];
function searchPrices(str, itemPricesArray){
  var itemPricesRes = itemPricesArray.filter(function(item){
    return item.custName.toLowerCase().includes(str.toLowerCase()) || item.custid.includes(str)
  });
  return itemPricesRes;
}

console.log(searchPrices('Mike', itemPrices));
console.log(searchPrices('1', itemPrices));
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

答案 3 :(得分:0)

const filterPrices = (arr, value) => arr
                                .filter(e => Object.values(e)
                                    .some(f => f.includes(value)));

此功能应该有效。它需要搜索对象数组和值。 它过滤数组,检查对象的值(Object.values),然后检查值数组的任何值(.some)是否包含搜索的值。

这假设您在正在开发的环境中支持String.prototype.includesObject.values