映射两个数组并删除重复,保留所有元素

时间:2016-11-03 13:57:52

标签: javascript arrays ecmascript-6

我有两个我想操纵的数组。它将用作列表。

假设它的系统向用户显示列表中最喜欢的水果。系统会显示几个水果,她可以标记她喜欢的水果,它们将附在他们的位置(索引)。

其他(空/未附加)位置将填充所有其他水果可用。

代码下方:



let favoriteFruits = [null, null, 'banana', null, 'pineapple', null, null, null, null, null]
let allFruits = ['grape', 'banana', 'orange', 'pineapple', 'blueberry', 'strawberry']
let fruitsDisplayed = new Array(10)

allFruits = allFruits.filter(fruit => !favoriteFruits.includes(fruit))

fruitsDisplayed = favoriteFruits.slice(0)
fruitsDisplayed = fruitsDisplayed.map((fruit, i) => fruit == null ? allFruits[i] : fruit)

console.log(fruitsDisplayed)




由于favoriteFruits是从allFruits收集的(用户只能在我们的所有列表中选择她喜欢的内容),所以当用户喜欢时会发生什么给定的水果(以及项目的索引存储在列表中)是,当我迭代allFruits数组以填充空格时,它会导致重复,这是我想要避免的。

预期结果是fruitsDisplayed favoriteFruits为他们的位置提供服务,在所有空格上添加allFruits,**除了已经被支持的**之外。我现在无法想办法。

请注意,我无法控制favoriteFruits,他们的水果/索引是由用户设定的。

我想要完成的事情(空格就在那里):

当前结果:

(我的蓝莓在哪里?)

[
  "grape",
  "orange",
  "banana",
  "strawberry",
  "pineapple",
  undefined,
  undefined,
  undefined,
  undefined,
  undefined
]

预期结果

[
  "grape",
  "orange",
  "banana", // already favorited
  "blueberry",
  "pineapple", // already favorited
  "strawberry",
  undefined,
  undefined,
  undefined,
  undefined
]

我不是JavaScript专家,所以如果答案质疑我正在做的任何代码练习,我会乐意编辑以满足我的需求。

2 个答案:

答案 0 :(得分:2)

您可以使用Set并删除已使用的项目,然后使用favoriteFruits构建新数组。

var favoriteFruits = [null, null, 'banana', null, 'pineapple', null, null, null, null, null],
    allFruits = ['grape', 'banana', 'orange', 'pineapple', 'blueberry', 'strawberry'],
    fruitsDisplayed,
    fruitSet = new Set(allFruits),
    restFruit;
		
favoriteFruits.forEach(a => fruitSet.delete(a));
restFruits = [...fruitSet],
fruitsDisplayed = favoriteFruits.map(a => a || restFruits.shift());

console.log(fruitsDisplayed);

答案 1 :(得分:0)

首先形成第三个数组,其中包含第一个和第二个数组的项目。

      var arr3 = [];
     arr1.forEach(function(item){
        arr3.push(item);
      });
     arr2.forEach(function(item){
       arr3.push(item); 
     }

然后使用此功能。

    var deduped = arr3.filter(function (el, i, arr) {
     return arr.indexOf(el) === i;
    });

   console.log(deduped);

来源:http://www.jstips.co/en/deduplicate-an-array/