比较JSON数组中typescript中的类似值

时间:2017-03-01 12:47:05

标签: arrays json typescript

我有2个JSON对象,一个是字符串数组,另一个是对象数组。我想检查对象数组中是否存在字符串数组中的值,如果存在,则在对象数组中设置特定值。

即:给定以下对象数组

### Object Array before
[{
   name: 'ABCDE',
   value: 'abcde',
   checked: false
},
{
   name: 'FGHIJ',
   value: 'fghij',
   checked: false
},
{
   name: 'KLMNO'
   value: 'klmno'
   checked: false
}]

并给出以下字符串数组:

[ 'fghij', 'klmno' ]

结果应如下:

### Object Array after
[{
   name: 'ABCDE',
   value: 'abcde',
   checked: false
},
{
   name: 'FGHIJ',
   value: 'fghij',
   checked: true
},
{
   name: 'KLMNO'
   value: 'klmno'
   checked: true
}]

2 个答案:

答案 0 :(得分:2)

这样的东西
 arr.map( v => Object.assign(v, {checked: stringArray.indexOf(v.value) !== -1 }))

arr是原始数组,stringArray包含['fghij','klmno']

修改Typescript Playground演示

如果您不想修改原始数组,请将assign调用更改为Object.assign({}, v, {checked: stringArray.indexOf(v.value) !== -1 })

答案 1 :(得分:0)

出于代码清晰度和性能原因,我建议收集ES6 Set对象中的值。

基本上你有两个选择:修改数组或复制数组。两个例子:

const data = [{
    name: 'ABCDE',
    value: 'abcde',
    checked: false
}, {
    name: 'FGHIJ',
    value: 'fghij',
    checked: false
}, {
    name: 'KLMNO',
    value: 'klmno',
    checked: false
}];

const toCheck = [ 'fghij', 'klmno' ];


const toCheckSet = new Set(toCheck);

// copying the data
const newData = data.map(obj => ({
    name: obj.name,
    value: obj.value,
    checked: toCheckSet.has(obj.value)
}));
console.log(newData);

// altering in place:
data.forEach(obj => { obj.checked = toCheckSet.has(obj.value); })
console.log(data);