Dojo mixin 两个数组如何?

Dojo mixin two Arrays how to?

我有以下情况:

我有一个这样的变量数组:

[
    {
        id: "foo",
        value: "bar"
    },
    {
        id: "baz",
        value: "buz"
    }
]

我有一个这样的默认数组:

[
    {
        id: "foo",
        value: "default"
    },
    {
        id: "bar",
        value: "default"
    },
    {
        id: "baz",
        value: "default"
    }
]

我想比较这两个数组并通过将缺少的默认值添加到第一个数组来将它们混合在一起。

这就是我想要的输出:

[
    {
        id: "foo",
        value: "bar"  // keep unchanged because it was already there
    },
    {
        id: "bar",
        value: "default"   // use the default because it was not in there
    },
    {
        id: "baz",
        value: "buz"   // also keep because it was already in the first array
    }
]

实现此目标的最佳方法是什么?感谢您的帮助!

解决该问题的方法之一是从与第一个数组具有相同 id 的条目中过滤第二个数组,并将其加入一个对象数组。

var arr1=[{id:"foo",value:"bar"},{id:"baz",value:"buz"}],
    arr2=[{id:"foo",value:"default"},{id:"bar",value:"default"},{id:"baz",value:"default"}];

    var arr3 = arr2.filter(v => arr1.every(c => c.id != v.id));
    console.log([...arr1, ...arr3]);

好吧,直接使用 dojo 是不可能的 - lang.mixin.. 因为 mixin 基本上处理 json 对象而不是对象数组(在你的情况下)。

解决方案 - 我刚刚写了一个 JavaScript 函数,它将 return 你合并的数组。

var baseArray = [{
            id: "foo",
            value: "bar"
        },
        {
            id: "baz",
            value: "buz"
        },
        {
            key: "key",
            value: "value"
        }
    ];

    var defaultArray = [{
            id: "foo",
            value: "default"
        },
        {
            id: "bar",
            value: "default"
        },
        {
            id: "baz",
            value: "default"
        }
    ];

var result = _mixinArrays(baseArray , defaultArray );
console.log(result);

function _mixinArrays(a, b){
    for (var i = 0; i < b.length; i++) {
        var matched = false;
        for (var j = 0; j < a.length; j++) {
            if (b[i].id == a[j].id) {               
                matched = true;
            }
        }
        if (!matched) {
            a.push(b[i]);
        }
    }
    return a;
}

希望这对您有所帮助:)