开发者问题收集

删除数组中的对象

2021-01-12
75

我有这个对象:

const data = { theValues: [ 
    {key1: "valueOne",
     key2: "someValue"}, 
    {key1:  "valueTwo",
     key2: "moreValue"}]}; 

如果我使用以下内容:

data.theValues = data.theValues.filter(obj => obj.key1 != 'valueOne');

我得到的结果如下:

 const data = { theValues: [ 
    {key1:  "valueTwo",
     key2: "moreValue"}]};

好的,这也是我想要的。但如果我有这个对象:

 const data = { theValues: [ 
     {key1:  ["valueOne", "valueTwo"],
      key2: "otherValue"},    
     {key1:  ["valueThree","valueFour"],
      key2: "noValue"}]};

我使用同样的东西:

data.theValues = data.theValues.filter(obj => obj.key1 != 'valueOne');

什么都没有发生。为什么会这样?我该如何删除值为“valueOne”的对象?

3个回答

由于 key 的值是一个数组,因此无法将其与字符串进行比较 - obj.key1 != 'valueOne' 始终为 true 。使用 Array.includes() 检查数组是否包含术语 ( valueOne ):

const data = {"theValues":[{"key1":["valueOne","valueTwo"],"key2":"otherValue"},{"key1":["valueThree","valueFour"],"key2":"noValue"}]};

const result = data.theValues.filter(obj => !obj.key1.includes('valueOne'));

console.log(result);
Ori Drori
2021-01-12

发生这种情况是因为 key1 是数组,而不是对象的键。因此,您可以使用 indexof 方法获得所需结果:

const result = data.theValues.filter(obj => obj.key1.indexOf('valueOne'));

示例:

const data = { "theValues":
    [
          { "key1": ["valueOne", "valueTwo"], "key2": "otherValue" }
        , { "key1": ["valueThree", "valueFour"], "key2": "noValue" }
    ]
};



const result = data.theValues.filter(obj => obj.key1.indexOf('valueOne'));

console.log(result);
StepUp
2021-01-12

它不起作用,因为您正在将数组与字符串进行比较。这里, key1 是一个数组,而 valueOne 是字符串。您可以将 Array.prototype.filter() Array.prototype.some() 方法结合使用。过滤 key1 不包含 valueOne 的数组。

Some method returns true if at least one element in the array passes the test.

const data = {
  theValues: [
    { key1: ['valueOne', 'valueTwo'], key2: 'otherValue' },
    { key1: ['valueThree', 'valueFour'], key2: 'noValue' },
  ],
};
const ret = data.theValues.filter((x) => !x.key1.some((y) => y === 'valueOne'));
console.log(ret);
mr hr
2021-01-12