这种比较有点奇怪,因为我有以下格式:
{
models: [
{... attributes: {} },
{... attributes: {} },
{... attributes: {} }
]
}
[{}, {}, {}]
我的object
包含array
个更多 objects
,其中包含一个名为 属性的密钥。
我的目标是使用Underscore.JS查看 数据阵列 中的哪些项目不会作为models数组中属性键的值存在。
这绝对不是我想要编码的方式,但localStorageLayers
是数据数组而layerPrefs
是首选项对象是以上标签。
_.each(localStorageLayers, (localLayer) => {
var layerWasLoaded = false;
_.each(layerPrefs.models, (layerPref) => {
if (_.isEqual(layerPref.attributes, localLayer)) {
layerWasLoaded = true;
// Don't do anything
}
})
if (layerWasLoaded == false) {
// Do stuff
}
})
答案 0 :(得分:1)
你可以filter
将localStorageLayers
向下移动到localLayer
被发现等于some
个对象的所有(忽略layerPrefs.models
)的子集与其attributes
属性相比。
我不使用lodash
,但result
应仅包含localStorageLayers
中未找到相等内容的layerPrefs.models
。
const layerPrefs = {
models: [
{attributes: {foo: "foo"} },
{attributes: {foo: "bar"} },
{attributes: {baz: "baz"} }
]
};
const localStorageLayers = [
{foo: "foo"}, {hot: "dog"}, {hot: "dog"}, {baz: "baz"}
];
const result = _.filter(localStorageLayers, localLayer =>
!_.some(layerPrefs.models, layerPref =>
_.isEqual(layerPref.attributes, localLayer)
)
);
console.log(result);
// Remove duplicates
const noDupes = _.uniqBy(result, _.isEqual);
console.log(noDupes);

<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.5/lodash.min.js"></script>
&#13;
您可以通过localLayer
执行_.every
来反转每个!_.isEqual
的评估。
使用似乎更清晰。
const result = _.filter(localStorageLayers, localLayer =>
_.every(layerPrefs.models, layerPref =>
!_.isEqual(layerPref.attributes, localLayer)
)
);