我有两个数组,一个现有的集合和一个新的数组。我想通过以下方式将两者结合起来:
id
的元素,那么我们将添加它。id
中,那么只有当新项目的updated
属性值大于现有项的updated
属性值时,我们才会替换现有的项。我们不能修改传入的数组,必须返回组合数组。
function combineConversations(newConversations, existingConversations) {
const combined = [...existingConversations];
newConversations.forEach(conversation => {
const existingConversationIndex = indexOfObject(combined, conversation.id , 'id');
if (existingConversationIndex && conversation.updated > combined[existingConversationIndex].updated) {
combined[existingConversationIndex] = conversation;
} else {
combined.push(conversation);
}
});
return combined;
}
我想知道一种完整的功能方法。有一个吗?
发布于 2016-10-08 08:45:39
这样啊,原来是这么回事!
function combineConversations(myArr) {
return myArr.filter((item1, pos, arr) =>
arr.map(item2 => item1.id === item2.id && item1.updated === item2.updated).indexOf(true) === pos &&
arr.every(item2 => !(item1 !== item2 && item1.id === item2.id && item1.updated < item2.updated))
);
}
combineConversations([...newChat, ...oldChat]);
var oldChat = [
{id: 1, updated: 1985, data: "coucou"},
{id: 2, updated: 1995, data: "au revoir"},
{id: 3, updated: 2003, data: "bonjour"},
{id: 4, updated: 2016, data: "hallo"},
];
var newChat = [
{id: 1, updated: 1986, data: "coucou"},
{id: 2, updated: 2004, data: "bye"},
{id: 3, updated: 2001, data: "bonjour"},
{id: 5, updated: 2008, data: "vive le sport"}
];
var expected = [
{id: 1, updated: 1986, data: "coucou"},
{id: 2, updated: 2004, data: "bye"},
{id: 3, updated: 2003, data: "bonjour"},
{id: 4, updated: 2016, data: "hallo"},
{id: 5, updated: 2008, data: "vive le sport"}
];
谢谢@kevin-ternet你的回答。你让我走上了正轨!
发布于 2016-10-08 04:07:35
是的,您可以使用这样的功能方法来完成它:
var oldChat = [
{id: 1, updated: 1985, data: "coucou"},
{id: 2, updated: 1995, data: "au revoir"},
{id: 3, updated: 2003, data: "bonjour"}
];
var newChat = [
{id: 1, updated: 1986, data: "coucou"},
{id: 2, updated: 2004, data: "bye"},
{id: 3, updated: 2001, data: "bonjour"},
{id: 4, updated: 2008, data: "vive le sport"}
];
var result = (oldChat, newChat) => newChat.concat(oldChat).sort((a,b) => a.id-b.id).filter((item, index, arr) => index < arr.length - 1 ? item.id !== arr[index+1].id : true);
console.log(result(oldChat, newChat)); //[ { id: 1, updated: 1986, data: 'coucou' },
//{ id: 2, updated: 2004, data: 'bye' },
//{ id: 3, updated: 2003, data: 'bonjour' },
//{ id: 4, updated: 2008, data: 'vive le sport' } ]
编辑:我合并了旧数组和新数组,并对它们进行排序,获得具有相同id的附件,然后进行筛选,以保留具有唯一id或最新更新的数组。
发布于 2016-10-08 08:55:32
下面是解决您问题的另一种方法(我使用了@kevinternet示例,希望他不介意):
var oldChat = [
{id: 1, updated: 1985, data: "coucou"},
{id: 2, updated: 1995, data: "au revoir"},
{id: 3, updated: 2003, data: "bonjour"}
];
var newChat = [
{id: 1, updated: 1986, data: "coucou"},
{id: 2, updated: 2004, data: "bye"},
{id: 3, updated: 2001, data: "bonjour"},
{id: 4, updated: 2008, data: "vive le sport"}
];
var intersect = oldChat.reduce((memo, val) => memo.concat(newChat.find(v => val.id === v.id && val.updated < v.updated) || val), []);
var diff = newChat.filter(x => !oldChat.some(y => y.id === x.id));
console.log(intersect.concat(diff));
这样做的目的是:
find
具有特殊条件,新元素必须比旧元素更新得更多,否则,我们还没有找到正确的替换。oldChat
和newChat
之间不常见的元素。由于我们执行了从oldChat
到newChat
的特殊交集(这保证了oldChat
中的所有对象都将在新的对象中),所以我们执行从newChat
到oldChat
的区别。希望能帮上忙。
https://stackoverflow.com/questions/39931146
复制