是否有一种方法可以根据其他属性作为其他数组中的元素存在的次数来更新对象数组中的属性
我有2个数组,array1
和array2
:
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表达式来实现。
谢谢!
答案 0 :(得分:1)
您可以使用reduce
和map
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()
检查value
中array1
出现多少次了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);