Javascript 使用 includes 过滤对象

Javascript filter object using includes

我正在尝试使用 javascript 中的 filter() 函数过滤对象。

我想像这样过滤数组:[1615, 1616]。它在代码中被引用为 value.verdier.

数据集是一个大型数组,包含具有多个属性的对象,从 JSON 字符串解析而来。数组中的每个对象都有一个名为 kat_id.

的 属性

目标是减少数组,使其仅包含 kat_id=1615 或 kat_id=1616 的对象。或者我在 value.verdier.

中的任何其他值

我的代码是这样的:

dataset = dataset.filter(function (el) 
     {
        return value.verdier.includes(el.kat_id );
     });

我可能漏掉了一些非常明显的东西。

这是一个工作示例:

function isInRefList(value) {
  let refList = [5, 44, 560];
  return refList.includes(value); //returns boolean
}

var myarr = [12, 5, 8, 130, 44];
myarr = [12, 5, 8, 130, 44].filter(isInRefList);

console.log(myarr); //Prints filtered array

The goal is to reduce the array so that it only holds objects where kat_id=1615 or kat_id=1616. Or any other value that I have in value.verdier.

如果 kat_id 值和 value.verdier 中的值都是 数字 或所有 字符串。那是因为 includes 在你传递给它的东西和你调用它的数组中的条目之间做了一个 === 。所以 [1, 2, 3].includes("2")false["1", "2", "3"].includes(2).

我假设你不会发布问题,如果它有效的话,所以我假设 kat_id 的值类型和 value.verdier 中的值类型不同— 其中一个是数字,另一个是字符串。

如果 kat_id 的值是字符串,value.verdier 的值是数字,那么在使用 includes:

return value.verdier.includes(parseInt(el.kat_id, 10));

实例:

var value = {
    verdier: [1615, 1616]
};

var dataset = [
    {kat_id: "1", expected: "omit"},
    {kat_id: "2", expected: "omit"},
    {kat_id: "1615", expected: "retain"},
    {kat_id: "3", expected: "omit"},
    {kat_id: "1616", expected: "retain"},
    {kat_id: "4", expected: "omit"},
    {kat_id: "5", expected: "omit"},
];
dataset = dataset.filter(function (el) 
{
    return value.verdier.includes(parseInt(el.kat_id, 10));
});
console.log(dataset);

或者如果kat_id的值为数字,value.verdier的值为字符串,那么在使用includes之前需要将kat_id的数字转为字符串:

return value.verdier.includes(String(el.kat_id));

实例:

var value = {
    verdier: ["1615", "1616"]
};

var dataset = [
    {kat_id: 1, expected: "omit"},
    {kat_id: 2, expected: "omit"},
    {kat_id: 1615, expected: "retain"},
    {kat_id: 3, expected: "omit"},
    {kat_id: 1616, expected: "retain"},
    {kat_id: 4, expected: "omit"},
    {kat_id: 5, expected: "omit"},
];
dataset = dataset.filter(function (el) 
{
    return value.verdier.includes(String(el.kat_id));
});
console.log(dataset);

如果值变化(一些kat_id是字符串,其他是数字,and/or一些value.verdier值是字符串,其他是数字),你可能需要 some 而不是 includes 和类型不敏感的比较:

return value.verdier.some(function(val) { return String(val) === String(el.kat_id); });

实例:

var value = {
    verdier: [1615, "1616"]
};

var dataset = [
    {kat_id: "1", expected: "omit"},
    {kat_id: 2, expected: "omit"},
    {kat_id: "1615", expected: "retain"},
    {kat_id: "3", expected: "omit"},
    {kat_id: 1616, expected: "retain"},
    {kat_id: "4", expected: "omit"},
    {kat_id: 5, expected: "omit"},
];
dataset = dataset.filter(function (el) 
{
    return value.verdier.some(function(val) { return String(val) === String(el.kat_id); });
});
console.log(dataset);


我坚持使用上面的 ES5 级代码,因为你的问题似乎只使用了 ES5 级代码。但这里是那些使用 ES2015+ 的例子:

dataset = dataset.filter(el => value.verdier.includes(parseInt(el.kat_id, 10)));

const value = {
    verdier: [1615, 1616]
};

let dataset = [
    {kat_id: "1", expected: "omit"},
    {kat_id: "2", expected: "omit"},
    {kat_id: "1615", expected: "retain"},
    {kat_id: "3", expected: "omit"},
    {kat_id: "1616", expected: "retain"},
    {kat_id: "4", expected: "omit"},
    {kat_id: "5", expected: "omit"},
];
dataset = dataset.filter(el => value.verdier.includes(parseInt(el.kat_id, 10)));
console.log(dataset);

dataset = dataset.filter(el => value.verdier.includes(String(el.kat_id)));

const value = {
    verdier: ["1615", "1616"]
};

let dataset = [
    {kat_id: 1, expected: "omit"},
    {kat_id: 2, expected: "omit"},
    {kat_id: 1615, expected: "retain"},
    {kat_id: 3, expected: "omit"},
    {kat_id: 1616, expected: "retain"},
    {kat_id: 4, expected: "omit"},
    {kat_id: 5, expected: "omit"},
];
dataset = dataset.filter(el => value.verdier.includes(String(el.kat_id)));
console.log(dataset);

dataset = dataset.filter(el => value.verdier.some(val => String(val) === String(el.kat_id)));

const value = {
    verdier: [1615, "1616"]
};

let dataset = [
    {kat_id: "1", expected: "omit"},
    {kat_id: 2, expected: "omit"},
    {kat_id: "1615", expected: "retain"},
    {kat_id: "3", expected: "omit"},
    {kat_id: 1616, expected: "retain"},
    {kat_id: "4", expected: "omit"},
    {kat_id: 5, expected: "omit"},
];
dataset = dataset.filter(el => value.verdier.some(val => String(val) === String(el.kat_id)));
console.log(dataset);