【问题标题】:KnockOut.JS compare two arrays and remove unique value from second arrayKnockOut.JS 比较两个数组并从第二个数组中删除唯一值
【发布时间】:2016-12-19 04:08:14
【问题描述】:

我正在开发 Knockout.js。

var chosenFruit = ko.observableArray([]);
var allFruits   = ko.observableArray([]);

allFruits       =       [ "Apple" , "Bananna" , "Grapes" , "Oranges"]
chosenFruit     =       ["Apple" , "Bananna" , "kiwi"]

现在,由于第一个数组中不存在“Kiwi”(这意味着,在所有水果中),我想从第二个数组(chosenFruit)中删除“Kiwi”。

我想比较两个数组并从第二个数组中删除 - 第一个数组中不存在的值。

也就是说,经过比较后,第二个数组应该是:

chosenFruit   =        ["Apple" , "Bananna"]

请建议如何实现。

提前感谢您!

【问题讨论】:

  • 请写下你试过的。

标签: javascript jquery arrays knockout.js


【解决方案1】:

使用Array#filter方法

var allFruits = ["Apple", "Bananna", "Grapes", "Oranges"],
  chosenFruit = ["Apple", "Bananna", "kiwi"];

console.log(
  // iterate and filter out element
  chosenFruit.filter(function(v) {
    // check value present in array
    return allFruits.indexOf(v) > -1;
  })
)

更新 1:如果您想保留引用,请使用 Array#splice 删除元素。

var allFruits = ["Apple", "Bananna", "Grapes", "Oranges"],
  chosenFruit = ["Apple", "Bananna", "kiwi"];
// store length for iterating
var i = chosenFruit.length;

// iterate upto `0`
while (i--) {
  // check value exist in array
  if (allFruits.indexOf(chosenFruit[i]) == -1) {
    // if not present then remove it
    chosenFruit.splice(i, 1);
  }
}


console.log(chosenFruit);

更新 2: 通过敲除使用 Array#filter 执行类似的操作,它会生成一个新的过滤数组。

var chosenFruit = ko.observableArray(["Apple", "Bananna", "Grapes", "Oranges"]);
var allFruits = ko.observableArray(["Apple", "Bananna", "kiwi"]);

console.log(
  chosenFruit().filter(function(v) {
    return allFruits().indexOf(v) > -1;
  })
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

更新 3 :如果您想更新 observableArray,请使用带有回调函数的 remove() 方法。

var chosenFruit = ko.observableArray(["Apple", "Bananna", "Grapes", "Oranges"]);
var allFruits = ko.observableArray(["Apple", "Bananna", "kiwi"]);

allFruits.remove(function(v) {
  return chosenFruit().indexOf(v) == -1;
});

console.log(allFruits())
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

【讨论】:

  • 您没有从chosenFruit 数组中删除任何内容。
  • @Redu :仅分配返回值就可以解决问题chosenFruit = chosenFruit.filter(function(v) { return allFruits.indexOf(v) > -1; }) .....但它会破坏引用,我认为这里没有必要引用
  • 不,它不会成功。如果您这样做,任何引用chosenFruit 的数组仍将显示["Apple"、"Bananna"、"kiwi"]。由于赋值运算符 (=),引用将丢失。
  • @user2598808:有什么错误吗?您需要分配返回值chosenFruit = chosenFruit.filter(function(v) { return allFruits.indexOf(v) > -1; })
  • @PranavCBalan 非常感谢!
【解决方案2】:

您可以通过定位并删除不应该在chosenFruits数组中的项目来执行以下操作。;

allFruits   = [ "Apple" , "Bananna" , "Grapes" , "Oranges"],
chosenFruit = ["Apple" , "Bananna" , "Kiwi", "Melon", "Cockroach"];
  discarded = chosenFruit.reduceRight((p,c,i,a) => !allFruits.includes(c) ? p.concat(a.splice(i,1)) : p,[]);
	                                                                 
console.log(chosenFruit);
console.log(discarded);

具有常规功能;

allFruits   = [ "Apple" , "Bananna" , "Grapes" , "Oranges"],
chosenFruit = ["Apple" , "Bananna" , "Kiwi", "Melon", "Cockroach"];
  discarded = chosenFruit.reduceRight(function(p,c,i,a){
                                        return allFruits.indexOf(c) === -1 ? p.concat(a.splice(i,1))
                                                                           : p;
                                      },[]);
	                                                                 
console.log(chosenFruit);
console.log(discarded);

【讨论】:

  • 如果这是一个愚蠢的问题,我很抱歉,但是这个符号“=>”是什么?我正在尝试使用 KnockOut.JS 在 JS 文件中实现这一点。
  • @user2598808 ES6 箭头函数
  • @user2598808 这是一个称为箭头函数的函数定义。我将在常规函数定义中给出上述sn-p的修改版本。
  • @Redu 非常感谢您的回复。请建议我们能否在 JavaScript 文件中使用该箭头。
  • @user2598808 如果您的目标环境符合 JS 的 ES6 标准,您可以安全地使用箭头。
【解决方案3】:

console.log($(["Apple" , "Bananna" , "kiwi"]).filter([ "Apple" , "Bananna" , "Grapes" , "Oranges"]).get());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

【讨论】:

  • 谢谢@Laurianti,我需要使用KnockOut.JS
猜你喜欢
  • 2013-10-11
  • 1970-01-01
  • 2019-06-12
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多