首页 > 解决方案 > 根据条件将数组的元素替换为另一个数组的元素

问题描述

我有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内容。结果应该是这样的: id

array1 = [{"name": "a", "id" : "1"}, {"name": "b", "id" : "2"}, {"name": "c", "id" : "3"}]

我知道我可以在一个单独的数组中得到结果,但我想替换 array1 的内容而不必创建一个新数组。

我试过这个:

array1.splice(0, Infinity, ...array2)

基于对此处类似问题的回答

这导致:

array1 = [{"name": "a", "id" : "1"}, {"name": "b", "id" : "2"}, {"name": "c", "id" : "3"}, {"name": "c", "id" : "4"}]

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

标签: javascriptarrays

解决方案


您还可以在 array1 中搜索 array2 id,然后将 array1 的索引替换为匹配的 array2 索引。

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)

编辑:我尝试了一种不同的方法,将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"}]

array1 = array1.map(num => {
  return array2.filter(dict => {
    if(dict["id"] == num) {return dict}
  })[0]
})

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 = _.map(array1, function(o){return _.find(array2, {id: o})})

console.log(array1)
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>


推荐阅读