我有两个我想操纵的数组。它将用作列表。
假设它的系统向用户显示列表中最喜欢的水果。系统会显示几个水果,她可以标记她喜欢的水果,它们将附在他们的位置(索引)。
其他(空/未附加)位置将填充所有其他水果可用。
代码下方:
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专家,所以如果答案质疑我正在做的任何代码练习,我会乐意编辑以满足我的需求。
答案 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);