更新对象数组中的属性

时间:2020-04-07 10:55:20

标签: javascript

是否有一种方法可以根据其他属性作为其他数组中的元素存在的次数来更新对象数组中的属性

我有2个数组,array1array2

var array1 = ["JOHN", "JACK", "JACK"];
var array2 = [
  {count: 9, value: "JACK"},
  {count: 9, value: "JOHN"},
  {count: 2, value: "TEST"}
];

预期输出:

[
  {count: 7, value: "JACK"}, // count = 9 - 2
  {count: 8, value: "JOHN"}, // count = 9 - 1
  {count: 2, value: "TEST"}
]

array1中,“ JACK”出现两次,因此我需要将计数减少2,类似地,“ JOHN”出现一次,因此将其减少1,“ TEST”就不会保持不变。 / p>

我尝试了以下

array1.map(item => {
  return array2.find( p => p["value"] === item);
});

有了这个,我得到以下输出,

[
  {count: 9, value: "JOHN"},
  {count: 9, value: "JACK"},
  {count: 9, value: "JACK"}
]

我不确定是否可以使用单个lambda表达式来实现。

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用reducemap

  1. 遍历array1并创建一个映射器对象,其名称为键,名称重复为值
  2. 遍历array2,看看映射器中是否存在该名称,然后从中减去相应的值

const array1 = ["JOHN", "JACK", "JACK"];
const array2 = [{count: 9, value: "JACK"},{count: 9, value: "JOHN"},{count: 2, value: "TEST"}]

const mapper = array1.reduce((op, inp) => {
  op[inp] = op[inp] || 0;
  op[inp]++;
  return op;
}, Object.create(null))

let final = array2.map(({count,value}) =>({
    value,
    count: count - (mapper[value] || 0)
}))

console.log(final)

答案 1 :(得分:1)

假设您不允许更改原始数组,则可以使用数组.map().filter()方法获得结果:

var array1  =  ["JOHN", "JACK", "JACK"];
var array2  = [{count: 9, value: "JACK"}, {count: 9, value: "JOHN"}, {count: 2, value: "TEST"}]
       
var result = array2.map(({value, count}) => ({value, count: count - array1.filter(a=>a===value).length}))
console.log(result)
.as-console-wrapper { max-height: 100% !important; top: 0; }

  • 使用.filter()检查valuearray1出现多少次了
  • 然后从当前的array2计数中减去该结果。
  • 然后只返回具有更新计数的新对象数组。

答案 2 :(得分:1)

假设您可以更改原始数组。还假设我们不是在说上万个条目,因为每次都在名称数组中查找值:

var array1  =  ["JOHN", "JACK", "JACK"];
var array2  = [{count: 9, value: "JACK"},
       {count: 9, value: "JOHN"},
       {count: 2, value: "TEST"}]

array2.forEach(item => item.count -= array1.filter(val => val === item.value).length);

console.log(array2);

资源少

var array1  =  ["JOHN", "JACK", "JACK"];
var array2  = [{count: 9, value: "JACK"},
       {count: 9, value: "JOHN"},
       {count: 2, value: "TEST"}]

// create lookup table
const names = array1.reduce((arr,cur) => { arr[cur] = (arr[cur]||0) + 1;  return arr;},{})
// subtract if present
array2.forEach(item => item.count -= (names[item.value] || 0));

console.log(array2);