根据另一个数组中值的存在向对象数组添加一个属性

时间:2018-09-06 14:39:27

标签: javascript typescript ecmascript-6

我有一个要检查的主数组,

const arrayToCheck = ['a', 'b', 'c', 'd'];

这是Main数组,

const mainArray = [ {name:'alex', code: 'c'}, 
                    {name:'jack', code: 'd'}, 
                    {name:'john', code: 'n'}, 
                    {name:'mike', code: 'l'}
                  ]

我想根据arrayToCheck中的值向mainArray添加键为“启用”或“禁用”的状态属性。

所以输出应该是

[ {name:'alex', code: 'c', status: 'enable'}, 
  {name:'jack', code: 'd', status: 'enable'}, 
  {name:'john', code: 'n', status: 'disable'}, 
  {name:'mike', code: 'l', status: 'disable'}
]

我已经尝试了map和一些方法来获得所需的输出,但是没有成功,

这是我尝试过的,

const output = this.mainArray.map( (fil, i) => {
          return arrayToCheck.some( s => {
            if (s === fil.Code) {
              this.mainArray[i].Status = 'enable'
            } else {
              this.mainArray[i].Status = 'disable'
            }
          })
        });

3 个答案:

答案 0 :(得分:3)

您可以将map方法与includes一起使用,并扩展语法...。此解决方案返回 new 对象数组,并且不修改原始数组。

const arrayToCheck = ['a', 'b', 'c', 'd'];
const mainArray = [ {name:'alex', code: 'c'}, {name:'jack', code: 'd'}, {name:'john', code: 'n'}, {name:'mike', code: 'l'}]

const result = mainArray.map(e => ({...e, status: arrayToCheck.includes(e.code) ? "enable" : "disable"}))
console.log(result)

答案 1 :(得分:2)

有几件事:

  1. JavaScript是区分大小写的Codecode是不同的属性。

  2. 您不会从map回调中返回任何内容,因此map不是正确的工具。如果您只想循环浏览,请使用循环或forEach

  3. 使用some返回值,而不要在其回调中执行if但是,这里不需要some,因为可以使用includes

假设您想做的是在问题中所做的事情(修改现有对象,而不是创建新对象):

const arrayToCheck = ['a', 'b', 'c', 'd'];

const mainArray = [ {name:'alex', code: 'c'}, {name:'jack', code: 'd'}, {name:'john', code: 'n'}, {name:'mike', code: 'l'}];

mainArray.forEach(entry => {
    entry.status = arrayToCheck.includes(entry.code) ? "enable" : "disable";
});

console.log(mainArray);

如果您想创建对象,Nenad's answer向您展示了如何做到这一点。但是我从你的问题中得不到答案。

答案 2 :(得分:1)

以下是易于理解的代码:

    const arrayToCheck = ['a', 'b', 'c', 'd'];
    const mainArray = [ {name:'alex', code: 'c'}, {name:'jack', code: 'd'}, {name:'john', code: 'n'}, {name:'mike', code: 'l'}]    
    const output = mainArray.map(obj => {
            obj.status = arrayToCheck.indexOf(obj.code) < 0 ? 'disable' : 'enable';
            return obj;
        })
    console.log(output);