简体   繁体   English

合并和重新排列两个对象数组

[英]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属性是每个对象的唯一标识符
  • Output needs to only have the objects listed in the originalArray 输出只需要在originalArray列出对象
  • Order of localStorageArray needs to be maintained, with attention paid to previous requirement (order should be: bar , foo , baz ) 需要维护localStorageArray顺序,并注意先前的要求(顺序应为: barfoobaz
  • Output needs to contain the following property values from localStorageArray : hidden and width ( field is a give-in, since its the identifier) 输出需要包含localStorageArray的以下属性值: hiddenwidthfield是一个让步,因为它是标识符)
  • All other properties of 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;
        }
    });
});  

Full JS Fiddle 完整的JS小提琴

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM