通过键字符串

时间:2019-07-07 11:36:38

标签: javascript arrays object vue.js

我有一个对象数组,我想通过调用一个函数并传递该数组和要删除的键来删除该对象的一些属性。

我在堆栈溢出问题上提到了this答案,当我手动指定密钥(例如id)时,它会起作用。它将删除数组中每个对象的id属性。

const newArray = array.map(
            ({
                id,
                ...otherAttributes
            }) => otherAttributes
        );

但是当我将键传递给函数,然后使用参数中的键时,它无法检测到对象中的键,因此无法将其删除。函数主体是这样的:

removeKeyFromObjectsArray(newArray, key) {           
        const newArray = products.map(
            ({
                key,
                ...otherAttributes
            }) => otherAttributes
        );
        return newArray;

我使用this.removeKeyFromObjectsArray(this.updatedProducts, 'id')调用此函数,但此数组内的对象仍具有键。 (this是因为它在Vue应用程序内部,因此我需要在同一实例中引用其他函数)。

如果我们手动指定诸如id之类的键名,则此函数有效,但是当我们通过参数传递键串然后使用它时,该函数不起作用,有人可以解释这里的问题是什么,我该如何解决?解决吗?

2 个答案:

答案 0 :(得分:3)

要使用computed property names in destrcuturing,需要用key包装[]并将其分配给新变量(在这种情况下为_)。否则,它将从对象中破坏名为"key"的属性,而不是key变量中带有 value 的属性

function removeKeyFromObjectsArray(products, key) {
    const newArray = products.map(
      ({
        [key]: _,
        ...otherAttributes
      }) => otherAttributes
    );
    return newArray;
}

console.log(
  removeKeyFromObjectsArray([{ id: 1, name: 'name1'},
                            { id: 2, name: 'name2'}], 'name')
)

答案 1 :(得分:1)

这将删除文字key-使用带方括号[]的动态属性符号来获得所需的结果:

const newArray = products.map(({ [key]: _, ...otherAttributes }) => otherAttributes);

我将不必要的密钥分配给上面的_的原因是因为习惯上将_用作“不需要的”或“忽略此”密钥。请注意,这不同于使用__key)前缀 的键,这意味着“不要直接修改它-而是使用getter或setters”。