我有2个数组,
let array1 = ["1", "2", "3"]
let array2 = [{"name": "a", "id" : "1"}, {"name": "b", "id" : "2"}, {"name": "c", "id" : "3"}, {"name": "c", "id" : "4"}]
当 array1 元素和 array2 {{时,我想用 array2 元素替换 array1 的内容1}}元素的值匹配。 结果应该是这样的:
id
我知道我可以在单独的数组中获得结果,但是我想替换array1的内容而不必创建新的数组。
我尝试过:
array1 = [{"name": "a", "id" : "1"}, {"name": "b", "id" : "2"}, {"name": "c", "id" : "3"}]
基于对类似问题here的回答
结果是:
array1.splice(0, Infinity, ...array2)
我尝试了不同的方法向此语句添加条件,但失败了。有没有办法为上面的拼接方法添加条件?或者,如果有更好的方法可以实现,请提出建议。
答案 0 :(得分:2)
您还可以在array1中搜索array2 id,然后用匹配的array2索引替换array1的索引。
package.json
编辑:我通过映射array1中的每个值与比较过滤器中的array2 id的值来尝试了一种不同的方法,我不认为这是否是更干净的解决方案,但我尝试了:
let array1 = ["1", "2", "3"]
let array2 = [{"name": "a", "id" : "1"}, {"name": "b", "id" : "2"}, {"name": "c", "id" : "3"}, {"name": "c", "id" : "4"}]
array2.forEach(function(e){
if(array1.indexOf(e["id"]) != -1) {
array1[array1.indexOf(e["id"])] = e
}
})
console.log(array1)
如果可以使用lodash,它会很短:
let array1 = ["1", "2", "3"]
let array2 = [{"name": "a", "id" : "1"}, {"name": "b", "id" : "2"}, {"name": "c", "id" : "3"}, {"name": "c", "id" : "4"}]
array1 = array1.map(num => {
return array2.filter(dict => {
if(dict["id"] == num) {return dict}
})[0]
})
console.log(array1)
let array1 = ["1", "2", "3"]
let array2 = [{"name": "a", "id" : "1"}, {"name": "b", "id" : "2"}, {"name": "c", "id" : "3"}, {"name": "c", "id" : "4"}]
array1 = _.map(array1, function(o){return _.find(array2, {id: o})})
console.log(array1)
答案 1 :(得分:1)
看起来像Array.filter
会完成这项工作吗?
let array1 = ["1", "2", "3"];
array1 = [
{"name": "a", "id" : "1"},
{"name": "b", "id" : "2"},
{"name": "c", "id" : "3"},
{"name": "c", "id" : "4"}
].filter(v => array1.includes(v.id));
// using Array.indexOf (IE >= 9, nodejs all versions),
let array2 = ["1", "2", "3"];
array2 = [
{"name": "a", "id" : "1"},
{"name": "b", "id" : "2"},
{"name": "c", "id" : "3"},
{"name": "c", "id" : "4"}
].filter(v => array2.indexOf(v.id) > -1);
console.log(array1);
console.log(array2);
答案 2 :(得分:1)
我们可以使用keyed collection - Map来按键获取项目。
const array1 = ["1", "2", "3"]
const array2 = [{"name": "a", "id" : "1"}, {"name": "b", "id" : "2"}, {"name": "c", "id" : "3"}, {"name": "c", "id" : "4"}]
const array2Map = new Map(array2.map(o=> [o.id, o]));
const result = array1.map(o => ({
...array2Map.get(o)
}));
console.log(result);
此外,您可以使用filter
和some
方法来获得所需的结果:
let array1 = ["1", "2", "3"]
let array2 = [{"name": "a", "id" : "1"}, {"name": "b", "id" : "2"}, {"name": "c", "id" : "3"}, {"name": "c", "id" : "4"}]
array1 = array2.filter(f=> array1.some(s=> s == f.id));
console.log(array1);
另一种方法,但是更冗长且不是最佳方法:
let array1 = ["1", "2", "3"]
let array2 = [{"name": "a", "id" : "1"}, {"name": "b", "id" : "2"}, {"name": "c", "id" : "3"}, {"name": "c", "id" : "4"}]
array1 = array1.map(a => {
let obj = array2.find(a2=> a2.id == a);
if (obj) return obj;
return a;
})
console.log(array1);
答案 3 :(得分:1)
let array1 = ["1", "2", "3"]
let array2 = [{"name": "a", "id" : "1"}, {"name": "b", "id" : "2"}, {"name": "c", "id" : "3"}, {"name": "c", "id" : "4"}]
array1 = array2.filter(f=> array1.find(s=> s == f.id));
console.log(array1);
/**outPut :[
{
"name": "a",
"id": "1"
},
{
"name": "b",
"id": "2"
},
{
"name": "c",
"id": "3"
}
]**/