dojo mixin两个数组如何?

cs7cruho  于 2022-12-20  发布在  Dojo
关注(0)|答案(2)|浏览(255)

我有以下情况:
我有一个这样的变量数组:

[
    {
        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
    }
]

什么是最好的方法来实现这一点?谢谢你的帮助!

ui7jx7zq

ui7jx7zq1#

解决这个问题的方法之一是从与第一个数组中具有相同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]);
yftpprvb

yftpprvb2#

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

**解决方案-**我刚刚编写了一个JavaScript函数,它将返回合并后的数组。

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;
}

希望这对你有帮助:)

相关问题