[英]Merging and reordering two arrays of objects
I'm trying to figure out how to merge two arrays of objects. 我试图弄清楚如何合并两个对象数组。 Here's what I need to do:
这是我需要做的:
field
property is the unique identifier of each object field
属性是每个对象的唯一标识符 originalArray
originalArray
列出对象 localStorageArray
needs to be maintained, with attention paid to previous requirement (order should be: bar
, foo
, baz
) localStorageArray
顺序,并注意先前的要求(顺序应为: bar
, foo
, baz
) localStorageArray
: hidden
and width
( field
is a give-in, since its the identifier) localStorageArray
的以下属性值: hidden
和width
( field
是一个让步,因为它是标识符) originalArray
need to be maintained in output originalArray
所有其他属性需要在输出中维护 Here's my wack at it: 这是我的理由:
outputArray.forEach(function(originalItem){
localStorageArray.forEach(function(localItem){
if(originalItem.field === localItem.field){
originalItem.hidden = localItem.hidden;
originalItem.width = localItem.width;
}
});
});
I was able to get the properties all right, but I'm a little lost on how to reorder according to localStorageArray
. 我能够正确设置属性,但是我对如何根据
localStorageArray
重新排序有些localStorageArray
。 I first thought to do so within the previous set of .forEach()
functions, but then I thought not to mess with the order within the forEach
loops, since I thought that might mess some things up. 我首先想到在上一组
.forEach()
函数中这样做,但是后来我认为不要弄乱forEach
循环中的顺序,因为我认为这可能会使某些事情弄糟。
Any suggestions to my solution? 对我的解决方案有什么建议吗?
Here are my arrays: 这是我的数组:
var originalArray = [{
field: "foo",
hidden: true,
sortable: false,
template: "<div>#=text#</div>",
width: "20px",
propA: "a",
propB: "b"
}, {
field: "bar",
hidden: false,
sortable: false,
template: "",
width: "20%",
propC: "C"
}, {
field: "baz",
hidden: false,
sortable: true,
template: "<span>#=text#</span>",
int: 3
}];
var localStorageArray = [{
field: "bar",
hidden: false,
sortable: false,
width: "100px"
}, {
field: "foo",
hidden: true,
sortable: false,
template: "<div>#=text#</div>",
width: "40px"
}, {
field: "boo",
hidden: true,
sortable: true,
template: "<div>Boo: #=text#</div>",
width: "200px"
}, {
field: "baz",
hidden: true,
template: "baz:#=text#",
width: "20px"
}];
And here is my desired output: 这是我想要的输出:
var desiredArray = [{
field: "bar",
hidden: false,
sortable: false,
template: "",
width: "100px",
propC: "C"
}, {
field: "foo",
hidden: true,
sortable: false,
template: "<div>#=text#</div>",
width: "40px",
propA: "a",
propB: "b"
}, {
field: "baz",
hidden: true,
sortable: true,
template: "<span>#=text#</span>",
width: "20px",
int: 3
}];
Check this fiddle: http://jsfiddle.net/j2u2hhk6/ 检查此小提琴: http : //jsfiddle.net/j2u2hhk6/
You can actually do it like this: 您实际上可以这样做:
var outputArray = [];
localStorageArray.forEach(function(localItem){
originalArray.forEach(function(originalItem){
if(originalItem.field === localItem.field){
var item = JSON.parse(JSON.stringify(originalItem));
item.hidden = localItem.hidden;
item.width = localItem.width;
outputArray.push(item);
}
});
});
Here is an example using ES6 methods. 这是使用ES6方法的示例。
/*global document, console, expect */ (function () { 'use strict'; var originalArray = [{ field: 'foo', hidden: true, sortable: false, template: '<div>#=text#</div>', width: '20px', propA: 'a', propB: 'b' }, { field: 'bar', hidden: false, sortable: false, template: '', width: '20%', propC: 'C' }, { field: 'baz', hidden: false, sortable: true, template: '<span>#=text#</span>', int: 3 }], localStorageArray = [{ field: 'bar', hidden: false, sortable: false, width: '100px' }, { field: 'foo', hidden: true, sortable: false, template: '<div>#=text#</div>', width: '40px' }, { field: 'boo', hidden: true, sortable: true, template: '<div>Boo: #=text#</div>', width: '200px' }, { field: 'baz', hidden: true, template: 'baz:#=text#', width: '20px' }], desiredArray = [{ field: 'bar', hidden: false, sortable: false, template: '', width: '100px', propC: 'C' }, { field: 'foo', hidden: true, sortable: false, template: '<div>#=text#</div>', width: '40px', propA: 'a', propB: 'b' }, { field: 'baz', hidden: true, sortable: true, template: '<span>#=text#</span>', width: '20px', int: 3 }], outputArray = [], pre = document.getElementById('out'), equalField = function (originalElement) { return originalElement.field === this.field; }; localStorageArray.reduce(function (acc, localElement) { var original = originalArray.find(equalField, localElement), shallowCopy; if (original) { shallowCopy = Object.assign({}, original); shallowCopy.hidden = localElement.hidden; shallowCopy.width = localElement.width; acc.push(shallowCopy); } return acc; }, outputArray); try { expect(outputArray).to.eql(desiredArray); pre.textContent = 'outputArray is equal to desiredArray\\n\\n'; } catch (e) { console.error(e); pre.textContent = 'outputArray is not equal to desiredArray\\n\\n'; } pre.textContent += JSON.stringify(outputArray, null, 2); }());
<script src="https://cdnjs.cloudflare.com/ajax/libs/es6-shim/0.32.0/es6-shim.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/expect.js/0.2.0/expect.min.js"></script> <pre id="out"></pre>
UPDATE: Based on your new comment and data, then this may be a solution. 更新:根据您的新注释和数据,这可能是一个解决方案。
var originalArray = [{ field: "foo", hidden: true, sortable: false, template: "<div>#=text#</div>", width: "20px", propA: "a", propB: "b" }, { field: "bee", hidden: true, sortable: false, template: "=#text#", int: 4 }, { field: "bar", hidden: false, sortable: false, template: "", width: "20%", propC: "C" }, { field: "baz", hidden: false, sortable: true, template: "<span>#=text#</span>", int: 3 }], localStorageArray = [{ field: "bar", hidden: false, sortable: false, width: "100px" }, { field: "foo", hidden: true, sortable: false, template: "<div>#=text#</div>", width: "40px" }, { field: "boo", hidden: true, sortable: true, template: "<div>Boo: #=text#</div>", width: "200px" }, { field: "baz", hidden: true, template: "baz:#=text#", width: "20px" }], desiredArray = [{ field: "bar", hidden: false, sortable: false, template: "", width: "100px", propC: "C" }, { field: "bee", hidden: true, sortable: false, template: "=#text#", int: 4 }, { field: "foo", hidden: true, sortable: false, template: "<div>#=text#</div>", width: "40px", propA: "a", propB: "b" }, { field: "baz", hidden: true, sortable: true, template: "<span>#=text#</span>", width: "20px", int: 3 }], outputArray = [], pre = document.getElementById('out'), equalField = function (originalElement) { return originalElement.field === this.field; }; localStorageArray.reduce(function (acc, localElement) { var original = originalArray.find(equalField, localElement), shallowCopy; if (original) { shallowCopy = Object.assign({}, original); shallowCopy.hidden = localElement.hidden; shallowCopy.width = localElement.width; acc.push(shallowCopy); } return acc; }, outputArray); originalArray.forEach(function (originalElement, index) { if (!this.find(equalField, originalElement)) { this.splice(index, 0, Object.assign({}, originalElement)); } }, outputArray); try { expect(outputArray).to.eql(desiredArray); pre.textContent = 'outputArray is equal to desiredArray\\n\\n'; } catch (e) { console.error(e); pre.textContent = 'outputArray is not equal to desiredArray\\n\\n'; } pre.textContent += JSON.stringify(outputArray, null, 2);
<script src="https://cdnjs.cloudflare.com/ajax/libs/es6-shim/0.32.0/es6-shim.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/expect.js/0.2.0/expect.min.js"></script> <pre id="out"></pre>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.