我有一个工作函数,将一个对象数组追加customData
到另一个对象数组的末尾testData
。如果name
在两个数组中都出现具有相同属性值的testData
对象,则该对象将被删除并替换customData
为结果数组中的对象。该customData
对象采用上一个testData
对象的顺序。
但是,这是我的尝试,我想知道是否有更好的方法可以轻松读取(es6)?
谢谢
https://codesandbox.io/s/recursing-river-bdp5k?file=/src/App.js
export default function App() {
const testData = [
{ display: "1", name: "TEST1" },
{ display: "2", name: "TEST2" }
];
const customData = [
{ display: "CUSTOM_1", name: "TEST1", custom: "YES" },
{ display: "CUSTOM_3", name: "TEST3", custom: "YES" }
];
let i = 0;
const newTestData = testData;
let newCustomData = customData;
while (i < customData.length) {
const view = customData[i];
const index = testData.findIndex(x => x.name === view.name);
if (index >= 0) {
newTestData[index] = customData[i];
newCustomData.splice(i, 1);
}
i += 1;
}
const concatData = newTestData.concat(newCustomData);
console.log(concatData)
return null;
}
Array#concat
不会使数组发生变化,因此无需将它们分配给新变量(无论如何也不会复制数组)。如果您想使用简洁的ES6代码,请跳过while循环-有许多等效项。这是一个例子:
您没有定义“更好的方式”,但我将其解释为“针对性能和可读性进行了最优化”。在下面的方法中,我使用一次通过来填充地图,另一次使用customData
在需要的地方覆盖地图条目,最后使用一次Object.values()
(技术上第三次)来生成结果。与您的O(n ^ 2)实现相比,这是O(n)(无嵌套循环)。
const testData = [
{ display: "1", name: "TEST1" },
{ display: "2", name: "TEST2" }
];
const customData = [
{ display: "CUSTOM_1", name: "TEST1", custom: "YES" },
{ display: "CUSTOM_3", name: "TEST3", custom: "YES" }
];
let map = {};
testData.forEach(item => map[item.name] = item);
customData.forEach(item => map[item.name] = item);
const result = Object.values(map);
console.log(result);
在很多情况下(包括该情况),您有一堆由唯一键(例如name
)标识的数据,您确实应该使用对象作为开始。任何时候需要数组时,都有Object.values()
和Object.keys()
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句