根据条件将一个数组的元素替换为另一个数组的元素

时间:2019-11-23 09:50:25

标签: javascript arrays

我有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)

我尝试了不同的方法向此语句添加条件,但失败了。有没有办法为上面的拼接方法添加条件?或者,如果有更好的方法可以实现,请提出建议。

4 个答案:

答案 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);

此外,您可以使用filtersome方法来获得所需的结果:

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"
  }
]**/